package com.dzt.tool.dao.interfaces;

import java.util.List;
import java.util.Map;

import com.dzt.tool.model.dto.Pager;

public interface BaseDao<T> {
	/**
	 * 
	 * 功能说明：添加或更新泛型对象
	 * 
	 * @param t
	 * @return
	 * @author: lql
	 * @DATE:2015-1-22 @TIME: 下午1:39:17
	 */

	public T addOrUpdate(T t);

	/**
	 * 添加泛型对象
	 * 
	 * @param t
	 */
	public T add(T t);

	/**
	 * 更新泛型对象
	 * 
	 * @param t
	 */
	public void update(T t);

	/**
	 * 根据ID获取泛型对象，然后进行删除
	 * 
	 * @param id
	 */
	public void delete(long id);

	/**
	 * 根据ID获取泛型对象，然后进行删除
	 * 
	 * @param id
	 */
	public void delete(String id);

	/**
	 * 删除一个泛型对象
	 * 
	 * @param t
	 */
	public void delete(T t);

	/**
	 * 根据ID获取对象
	 * 
	 * @param id
	 * @return
	 */
	public T load(long id);

	/**
	 * 根据ID获取对象
	 * 
	 * @param id
	 * @return
	 */
	public T load(String id);

	/**
	 * 通过hql获取一组泛型对象，不进行分页
	 * 
	 * @param hql
	 * @param args
	 * @return
	 */
	public List<T> list(String hql, Object[] args);

	public List<T> list(String hql, Object obj);

	public List<T> list(String hql);

	public List<T> list(String hql, Object[] args, Map<String, Object> alias);

	public List<T> listByAlias(String hql, Map<String, Object> alias);

	/**
	 * 通过hql获取一组对象，不进行分页
	 * 
	 * @param hql
	 * @param args
	 * @return
	 */
	public List<Object> listByObj(String hql, Object[] args);

	public List<Object> listByObj(String hql, Object obj);

	public List<Object> listByObj(String hql);

	/**
	 * 通过hql获取一组泛型对象，进行分页处理
	 * 
	 * @param hql
	 * @param args
	 * @return
	 */
	public Pager<T> find(String hql, Object[] args);

	public Pager<T> find(String hql, Object obj);

	public Pager<T> find(String hql);

	public Pager<T> find(String hql, Object[] args, Map<String, Object> alias);

	public Pager<T> findByAlias(String hql, Map<String, Object> alias);

	public List<T> findByEasyUI(String hql, int page, int rows, Object... param);

	public List<Object> findApp(String hql, int page, int rows, Object... param);

	/**
	 * 通过hql获取一组对象，进行分页处理
	 * 
	 * @param hql
	 * @param args
	 * @return
	 */
	public Pager<Object> findByObj(String hql, Object[] args);

	public Pager<Object> findByObj(String hql, Object obj);

	public Pager<Object> findByObj(String hql);

	/**
	 * 通过hql获取一个对象
	 * 
	 * @param hql
	 * @param args
	 * @return
	 */
	public Object queryByHql(String hql, Object[] args);

	public Object queryByHql(String hql, Object arg);

	public Object queryByHql(String hql);

	public Object queryByHql(String hql, Object[] args, Map<String, Object> alias);

	public Object queryByHqlByAlias(String hql, Map<String, Object> alias);

	/**
	 * 调用hql更新一组泛型对象
	 * 
	 * @param hql
	 * @param args
	 */
	public void executeByHql(String hql, Object[] args);

	public void executeByHql(String hql, Object arg);

	public void executeByHql(String hql);

	/**
	 * 根据SQL查询对象，不包含关联对象
	 * 
	 * @param sql
	 *            查询的SQL语句
	 * @param args
	 *            查询条件参数
	 * @param alias
	 *            查询条件（别名）
	 * @param clz
	 *            查询的实体对象
	 * @param hasEntity
	 *            是否是一个hibernate管理的实体对象
	 * @return
	 */
	public <N extends Object> List<N> listBySql(String sql, Object[] args, Map<String, Object> alias, Class<?> clz, boolean hasEntity);

	public <N extends Object> List<N> listBySql(String sql, Object[] args, Class<?> clz, boolean hasEntity);

	public <N extends Object> List<N> listBySql(String sql, Object arg, Class<?> clz, boolean hasEntity);

	public <N extends Object> List<N> listBySql(String sql, Class<?> clz, boolean hasEntity);

	public <N extends Object> List<N> listByAliasSql(String sql, Map<String, Object> alias, Class<?> clz, boolean hasEntity);

	public List<Object> listBySql(String sql, Object[] args);

	/**
	 * 根据SQL查询分页对象，不包含关联对象
	 * 
	 * @param sql
	 *            查询的SQL语句
	 * @param args
	 *            查询条件参数
	 * @param alias
	 *            查询条件（别名）
	 * @param clz
	 *            查询的实体对象
	 * @param hasEntity
	 *            是否是一个hibernate管理的实体对象
	 * @return
	 */
	public <N extends Object> Pager<N> findBySql(String sql, Object[] args, Map<String, Object> alias, Class<?> clz, boolean hasEntity);

	public <N extends Object> Pager<N> findBySql(String sql, Object[] args, Class<?> clz, boolean hasEntity);

	public <N extends Object> Pager<N> findBySql(String sql, Object arg, Class<?> clz, boolean hasEntity);

	public <N extends Object> Pager<N> findBySql(String sql, Class<?> clz, boolean hasEntity);

	public <N extends Object> Pager<N> findByAliasSql(String sql, Map<String, Object> alias, Class<?> clz, boolean hasEntity);

}